
#  图片 、验证码、干扰线、干扰点、颜色

# 类 ==》方法
import string,random,os
#                画布   画笔      字体        使图像模糊
from PIL import Image,ImageDraw,ImageFont,ImageFilter


class VerifyUtil:
    #  前端文件 里面写了 宽140  高 40
    #  length 验证码长度  size 字体大小
    def __init__(self,width = 140,height = 40,length = 4,size = 28):
        self.width = width
        self.height = height
        self.length = length
        self.size = size

    #  生成验证码的方法
    def random_str(self):
        res = string.ascii_letters + string.digits

        #  生成4个数   choice只能生成一个数  choices 可以指定生成多位数字
        return "".join(random.choices(res,k = self.length))  #  生成的是一个列表元素[]

    #  颜色
    # rgb(0,0,0) - rgb(255,255,255)
    def random_color(self):
        # li = []
        # for i in range(3):
        #     random.randint(0,255)
        #     li.append(random.randint(0,255))

        li = [random.randint(0,255) for i in range(3)]

        return tuple(li)

    # 干扰线
    def random_lines(self,draw):
        # random.randint(0,self.width)   #  x
        # random.randint(0,self.length)  #  y
        # (random.randint(0,self.width),random.randint(0,self.length))   #  (x,y)
        for i in range(6):
            lines = [(random.randint(0,self.width),random.randint(0,self.height)) for i in range(2)]
            print(lines)

            #  划线    [线条 ，  颜色，  线条粗细]
            draw.line(lines,fill=self.random_color(),width=2)


    #  干扰点
    def random_points(self,draw):
        for i in range(self.width):   #  获取行
            for j in range(self.height):  #  获取列
                #  生成随机数字来控制 干扰点的 比例
                if random.randint(0,100) <= 10 :
                    draw.point((i,j),self.random_color())


#  综合方法
    def verify_code(self):
        # 生成画布
        image = Image.new('RGB',(self.width,self.height),(255,255,255))

        # 字体文件  dirname    abspath  获取绝对路径
        file = os.path.dirname(os.path.abspath(__file__))
        font = ImageFont.truetype(f"{file}/HYYakuHei-85W.ttf",self.size)

        # 生成画笔   通过画布对象创建画笔对象
        draw = ImageDraw.Draw(image)
        # 验证码  干扰线  颜色  干扰点

        self.random_lines(draw)
        self.random_points(draw)
        code = self.random_str()

        #  验证码填入画布  x轴会发生偏移变化
        # (0,5)  (35,5)  (35+35,5)   (35+35+35,5)
        for i in range(self.length):
            #  text(x,y)  验证码内容 ，字体 ，颜色
            draw.text((i*25,5),code[i],font=font,fill=self.random_color())

        #  图像模糊处理  BLUR 高斯模糊
        # imges = image.filter(ImageFilter.BLUR)
        return image,code #imges



# if __name__ =='__main__':
#     imgverifyUtil = VerifyUtil()
#     # print(imgverifyUtil.random_str())
#     # print(imgverifyUtil.random_color())
#     # print(imgverifyUtil.random_lines())
#
#     img,code = imgverifyUtil.verify_code()
#     with open("test.png","wb") as f:
#         img.save(f)
#
#     print(code)

